﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using QuanLyKhachSan.Validation;
using DataAccess;
using System.Linq.Expressions;

namespace QuanLyKhachSan
{
    public class ChiTietHoaDonThuePhongManager:IValidator<ChiTietHoaDonThuePhong>,ILenhThucThi<ChiTietHoaDonThuePhong>
    {
        public ValidateResult Validate(ChiTietHoaDonThuePhong obj)
        {
            ValidateResult vResult = new ValidateResult();
            if (obj.MaKH.Trim()=="")
            {
                vResult.Message.Add("Chưa chọn mã khách hàng");
            }
            if (obj.SoPhong.Trim() == ""){
                vResult.Message.Add("Chưa chọn phòng thuê");
            }
            return vResult;
        }

        public ActionResult Them(ChiTietHoaDonThuePhong obj)
        {
            ActionResult aResult = new ActionResult();
            using (QLKhachSanContext context=new QLKhachSanContext())
            {
                var query = from cthdtp in context.ChiTietHoaDonThuePhongs
                            where cthdtp.MaHD == obj.MaHD && cthdtp.MaKH == obj.MaKH && cthdtp.SoPhong == obj.SoPhong
                            select cthdtp;
                var succhua = (from cthdtp in context.Phongs
                               where cthdtp.SoPhong == obj.SoPhong
                               select cthdtp).First();
                var socthdcuaphong = (from cthdtp in context.ChiTietHoaDonThuePhongs
                                                where cthdtp.SoPhong == obj.SoPhong && cthdtp.MaHD == obj.MaHD
                                                select cthdtp).ToList().Count;
                if (query.Any())
                {
                    aResult.Exceptions.Add(new Exception("Dòng dữ liệu vừa nhập đã tồn tại trong CSDL"));
                }
                else
                {
                    if (succhua.SucChua<socthdcuaphong+1)
                    {
                        aResult.Exceptions.Add(new Exception("Sức chứa của phòng đã đạt giới hạn không thể thêm nữa"));
                    }
                    else
                    {
                        try
                        {
                            context.ChiTietHoaDonThuePhongs.Add(obj);
                            context.SaveChanges();
                        }
                        catch (Exception e)
                        {
                            aResult.Exceptions.Add(e);
                        }
                    }
                }
            }
            return aResult;
        }

        public ActionResult Xoa(string ma)
        {
            throw new NotImplementedException();
        }

        public ActionResult CapNhat(ChiTietHoaDonThuePhong obj)
        {
            throw new NotImplementedException();
        }

        public ActionResultAsList<ChiTietHoaDonThuePhong> TimChiTietTheoDK(Expression<Func<ChiTietHoaDonThuePhong,bool>> predicate)
        {
            ActionResultAsList<ChiTietHoaDonThuePhong> aResult = new ActionResultAsList<ChiTietHoaDonThuePhong>();
            QLKhachSanContext context = new QLKhachSanContext();
            
            var query = (from cthdtp in context.ChiTietHoaDonThuePhongs
                        select cthdtp).Where(predicate);
            if (!query.Any())
            {
                aResult.Exceptions.Add(new Exception("Không tìm thấy chi tiết hóa đơn thuê phòng nào"));
            }
            else
            {
                aResult.Result = query.ToList();
            }
            
            return aResult;
        }


        public ActionResult Xoa(ChiTietHoaDonThuePhong ma)
        {
            ActionResult aResult = new ActionResult();
            using (QLKhachSanContext context = new QLKhachSanContext())
            {
                var deletect = (from cthdtp in context.ChiTietHoaDonThuePhongs
                                where cthdtp.MaHD == ma.MaHD && cthdtp.MaKH==ma.MaKH && cthdtp.SoPhong==ma.SoPhong
                                select cthdtp).FirstOrDefault();
                try
                {
                    context.ChiTietHoaDonThuePhongs.Remove(deletect);
                    context.SaveChanges();
                }
                catch (Exception e)
                {
                    aResult.Exceptions.Add(e);
                }
                
            }
            return aResult;
        }


        public ActionResultAsList<ChiTietHoaDonThuePhong> LayDanhSach()
        {
            throw new NotImplementedException();
        }
    }
}
